#!/usr/local/bin/tclsh8.5

#-----------------------------------------------------------------------------#
#	locDir	percorso																				#
#-----------------------------------------------------------------------------#
# Funzione che restituisce l'intero contenuto della directory						#
# ricevuta in ingresso																			#
#-----------------------------------------------------------------------------#
#	percorso		directory di cui si vuole conoscere il contenuto					#
#-----------------------------------------------------------------------------#
# La funzione restituisce una lista con i file e le directory contenuti nella #
# directory ricevuta in ingresso.															#
#-----------------------------------------------------------------------------#
proc locDir {percorso} {

	return [glob -directory $percorso -tails -nocomplain *]
}

#-----------------------------------------------------------------------------#
#	ls-R	percorso																					#
#-----------------------------------------------------------------------------#
# Funzione che restituisce la lista completa dei file .tcl presenti				#
# nella directory ricevuta in ingresso scendendo ricorsivamente nelle			#
# directory interne. I nomi dei file contengono il percorso relativo.			#
#-----------------------------------------------------------------------------#
#	percorso			directory di cui si vuole conoscere ricorsivamente il			#
#						contenuto in file .tcl													#
#-----------------------------------------------------------------------------#
# Viene restituita una lista dei file .tcl con il percorso relativo alla		#
# directory ricevuta in ingresso.															#
#-----------------------------------------------------------------------------#
proc ls-R {percorso} {
	
	set elenco ""
	set tmpElenco [locDir $percorso]

	while {[llength $tmpElenco] > 0} {
		
		set corrente [lindex $tmpElenco 0]
		set tmpElenco [lreplace $tmpElenco 0 0]

		if {[file isfile [file join ./ $corrente]] == 1} {

			if {[file extension $corrente] == ".tcl"} {
				lappend elenco $corrente
			}
		
		} else {

			set locPath [file join $percorso $corrente]
			set nuovi [locDir $locPath]
			foreach elem $nuovi {
				lappend tmpElenco [file join $corrente $elem]
			}
		}
	}

	return $elenco
}

#-----------------------------------------------------------------------------#
#	elabPackage		percorso																		#
#-----------------------------------------------------------------------------#
# Funzione che legge i file .tcl presenti nel percorso per creare un unico		#
# file pkgIndex indifferentemente dalla gerarchia.										#
#-----------------------------------------------------------------------------#
#	percorso			directory che contiene i sorgenti da leggere per creare il	#
#						package.																		#
#-----------------------------------------------------------------------------#
proc elabPackage {percorso} {

	# genero lista sorgenti
	set origine [pwd]
	cd $percorso
	set contenuto [ls-R [pwd]]
	cd $origine
	set l [llength $contenuto]

	# controllo i file sorgenti
	foreach elem $contenuto {

		file delete -force "$percorso/pkgIndex.tcl"
		if {[string last "pkgIndex.tcl" $elem] != -1} {
			continue
		}

		pkg_mkIndex -verbose $percorso $elem

		if {[file exists "${percorso}/pkgIndex.tcl"] != 1} {
			continue
		}

		set pfi [open "${percorso}/pkgIndex.tcl" "r"]
		while {1 == 1} {
			set num [gets $pfi riga]
			if {$num < 0} {
				break
			}
			if {[lindex $riga 0] != "package"} {
				continue
			}
			set nome			[lindex $riga 2]
			set versione	[lindex $riga 3]
			set comando		[string range $riga \
									[expr [string first $versione $riga] + \
											[string length $versione]		 + \
											1 \
									] \
								end]
			set coppia [list $nome $versione]
			if {[array get istruzioni $coppia] != ""} {
				set istruzioni($coppia) "$istruzioni($coppia)\\n$comando"
			} else {
				set istruzioni($coppia) $comando
			}
		}
		close $pfi
	}

	# genero il file pkgIndex.tcl
	set pfo [open "${percorso}/pkgIndex.tcl" "w"]

	puts $pfo "# Tcl package index file, version 1.1"
	puts $pfo "# This file is generated by the \"pkg_mkIndex\" command"
	puts $pfo "# and sourced either when an application starts up or"
	puts $pfo "# by a \"package unknown\" script.  It invokes the"
	puts $pfo "# \"package ifneeded\" command to set up package-related"
	puts $pfo "# information so that packages will be loaded automatically"
	puts $pfo "# in response to \"package require\" commands.  When this"
	puts $pfo "# script is sourced, the variable \$dir must contain the"
	puts $pfo "# full path name of this file's directory.\n"

	set elenco [array names istruzioni]
	foreach elem $elenco {
		puts $pfo \
			"package ifneeded [lindex $elem 0] [lindex $elem 1] $istruzioni($elem)"
	}

	close $pfo
}

#-----------------------------------------------------------------------------#

elabPackage versione
elabPackage servizio
elabPackage browser

